home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-01-23 | 12.6 KB | 506 lines | [TEXT/CWIE] |
- /******************** ***********************/
- //
- // Player PRO 4.6 - DRIVER SOURCE CODE -
- //
- // Library Version 4.6
- //
- // To use with MAD Library for Mac: Symantec, CodeWarrior and MPW
- //
- // Antoine ROSSET
- // 16 Tranchees
- // 1206 GENEVA
- // SWITZERLAND
- //
- // COPYRIGHT ANTOINE ROSSET 1996, 1997, 1998
- //
- // Thank you for your interest in PlayerPRO !
- //
- // FAX: (+41 22) 346 11 97
- // PHONE: (+41 79) 203 74 62
- // Internet: rosset@dial.eunet.ch or RossetAntoine@bluewin.ch
- //
- /******************** ***********************/
-
- #include "RDriver.h"
- #include "RDriverInt.h"
-
- void Sampler8in8Add( Channel *curVoice, register Ptr ASCBuffer, MADDriverRec *intDriver)
- {
- Ptr VolPtr;
- char *SndBuffer;
- Byte tByte;
- long i = intDriver->ASCBUFFER;
-
- ///
- long off, aDD, aCC = curVoice->lAC;
-
- aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
- ///
-
- if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize <= 0) return;
-
- SndBuffer = (char*) curVoice->curPtr;
- VolPtr = (Ptr) (intDriver->Vol + (long) (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64) << 8));
-
- if( (Ptr) SndBuffer + 1 + ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- if( (Ptr) SndBuffer + off + 1 >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
-
- tByte = (( LeftWeight **(SndBuffer + off)
- + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
-
- *ASCBuffer += *(VolPtr + tByte); aCC += aDD;
- ASCBuffer += 2;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- if( (Ptr) SndBuffer + off >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
- *ASCBuffer += *(VolPtr + (Byte) *(SndBuffer + off)); aCC += aDD;
- ASCBuffer += 2;
- }
- }
-
- if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- else
- {
- curVoice->samplePtr = 0L; curVoice->curPtr = curVoice->maxPtr;
- }
- }
- else
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
-
- tByte = (( LeftWeight **(SndBuffer + off)
- + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
-
- *ASCBuffer += *(VolPtr + tByte); aCC += aDD;
- ASCBuffer += 2;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- *ASCBuffer += *(VolPtr + (Byte) *(SndBuffer + off)); aCC += aDD;
- ASCBuffer += 2;
- }
- }
-
- curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- }
-
- curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
- }
-
- void Sampler8in16Add( Channel *curVoice, register Ptr ASCBuffer, MADDriverRec *intDriver)
- {
- char *SndBuffer;
- Byte tByte;
- Ptr VolPtr;
- long i = intDriver->ASCBUFFER;
-
- ///
- long aDD, aCC = curVoice->lAC, off;
-
- aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
- ///
-
- if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
-
- SndBuffer = (char*) curVoice->curPtr;
- VolPtr = (Ptr) (intDriver->Vol + (long) (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64) << 8));
-
- if( (Ptr) SndBuffer + 2 + 2L*((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- if( (Ptr) SndBuffer + 2*off + 2 >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
-
- tByte = (( LeftWeight * (*(SndBuffer + 2*off))
- + RightWeight * (*(SndBuffer + 2*off + 2))) >>BYTEDIV);
-
- *ASCBuffer += *(VolPtr + tByte); aCC += aDD;
- ASCBuffer += 2;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- if( (Ptr) SndBuffer + 2*off + 2 >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
-
- *ASCBuffer += *(VolPtr + (Byte) (*(SndBuffer + 2*off))); aCC += aDD;
- ASCBuffer += 2;
- }
- }
-
- if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + 2*(long) (aCC>>BYTEDIV));
- else
- {
- curVoice->samplePtr = 0L; curVoice->curPtr = curVoice->maxPtr;
- }
- }
- else
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
-
- tByte = (( LeftWeight * (*(SndBuffer + 2*off))
- + RightWeight * (*(SndBuffer + 2*off + 2))) >>BYTEDIV);
-
- *ASCBuffer += *(VolPtr + tByte); aCC += aDD;
- ASCBuffer += 2;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- *ASCBuffer += *(VolPtr + (Byte) (*(SndBuffer + 2*off))); aCC += aDD;
- ASCBuffer += 2;
- }
- }
-
- curVoice->curPtr = (Ptr) (SndBuffer + 2*(long) (aCC>>BYTEDIV));
- }
-
- curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
- }
-
- void Sampler8in8AddPoly( Channel *curVoice, register Ptr ASCBuffer, short chanNo, MADDriverRec *intDriver)
- {
- char *SndBuffer;
- Byte tByte;
- long i = intDriver->ASCBUFFER;
- Ptr VolPtr;
-
- ///
- long aDD, aCC = curVoice->lAC, off;
-
- aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
- ///
-
- if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
-
- SndBuffer = (char*) curVoice->curPtr;
- VolPtr = (Ptr) ( intDriver->Vol + (long) (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64) << 8));
-
- if( (Ptr) SndBuffer + 1 + ((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- if( (Ptr) SndBuffer + off + 1 >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
-
- tByte = ((LeftWeight **(SndBuffer + off)
- + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
-
- *ASCBuffer += *(VolPtr + tByte); aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- if( (Ptr) SndBuffer + off >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
- *ASCBuffer += *(VolPtr + (Byte) *(SndBuffer + off)); aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
-
- if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- else
- {
- curVoice->samplePtr = 0L; curVoice->curPtr = curVoice->maxPtr;
- }
- }
- else
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
-
- tByte = ((LeftWeight **(SndBuffer + off)
- + RightWeight **(SndBuffer + off + 1)) >> BYTEDIV);
-
- *ASCBuffer += *(VolPtr + tByte); aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- *ASCBuffer += *(VolPtr + (Byte) *(SndBuffer + off)); aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
-
- curVoice->curPtr = (Ptr) (SndBuffer + (long) (aCC>>BYTEDIV));
- }
-
- curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
- }
-
- void Sampler8in16AddPoly( Channel *curVoice, register Ptr ASCBuffer, short chanNo, MADDriverRec *intDriver)
- {
- char *SndBuffer;
- Byte tByte;
- Ptr VolPtr;
- long i = intDriver->ASCBUFFER;
-
- ///
- long aDD, aCC = curVoice->lAC, off;
-
- aDD = (AMIGA_CLOCKFREQ2 << BYTEDIV) / ( curVoice->period * (intDriver->DriverSettings.outPutRate>>16));
- ///
-
- if( curVoice->curPtr >= curVoice->maxPtr && curVoice->loopSize == 0) return;
-
- SndBuffer = (char*) curVoice->curPtr;
- VolPtr = (Ptr) (intDriver->Vol + (long) (((DoVol( curVoice) * intDriver->VolExt[ curVoice->ID])/ 64) << 8));
-
- if( (Ptr) SndBuffer + 2 + 2*((aCC + aDD * intDriver->ASCBUFFER)>>BYTEDIV) >= curVoice->maxPtr)
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
- if( (Ptr) SndBuffer + 2*off + 2 >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
-
- tByte = ((LeftWeight *(*(SndBuffer + 2*off))
- + RightWeight *(*(SndBuffer + 2*off + 2)))>> BYTEDIV);
-
- *ASCBuffer += *(VolPtr + tByte); aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- if( (Ptr) SndBuffer + 2*off + 2 >= curVoice->maxPtr)
- {
- if( curVoice->loopSize > 0)
- {
- SndBuffer -= curVoice->loopSize;
- if( SndBuffer + off < curVoice->begPtr) SndBuffer = curVoice->begPtr - off;
- }
- else break;
- }
-
- *ASCBuffer += *(VolPtr + (Byte) (*(SndBuffer + 2*off))); aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
-
- if( curVoice->loopSize > 0) curVoice->curPtr = (Ptr) (SndBuffer + 2*(long) (aCC>>BYTEDIV));
- else
- {
- curVoice->samplePtr = 0L; curVoice->curPtr = curVoice->maxPtr;
- }
- }
- else
- {
- if( intDriver->DriverSettings.Interpolation)
- {
- long RightWeight, LeftWeight;
-
- while( i-- > 0)
- {
- RightWeight = aCC & ((1 << BYTEDIV) - 1); LeftWeight = (1 << BYTEDIV) - RightWeight;
-
- off = (aCC>>BYTEDIV);
-
- tByte = ((LeftWeight *(*(SndBuffer + 2*off))
- + RightWeight *(*(SndBuffer + 2*off + 2)))>> BYTEDIV);
-
- *ASCBuffer += *(VolPtr + tByte); aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
- else
- {
- while( i-- > 0)
- {
- off = (aCC>>BYTEDIV);
- *ASCBuffer += *(VolPtr + (Byte) (*(SndBuffer + 2*off))); aCC += aDD;
- ASCBuffer += chanNo;
- }
- }
-
- curVoice->curPtr = (Ptr) (SndBuffer + 2*(long) (aCC>>BYTEDIV));
- }
-
- curVoice->lAC = aCC & ((1 << BYTEDIV) - 1);
- }
-
-
- void Sample8BufferAdd( Channel *curVoice, register Ptr ASCBuffer, MADDriverRec *intDriver)
- {
- if( curVoice->amp == 16) Sampler8in16Add( curVoice, ASCBuffer, intDriver);
- else Sampler8in8Add( curVoice, ASCBuffer, intDriver);
- }
-
- void Sample8BufferAddPoly( Channel *curVoice, register Ptr ASCBuffer, short chanNo, MADDriverRec *intDriver)
- {
- if( curVoice->amp == 16) Sampler8in16AddPoly( curVoice, ASCBuffer, chanNo, intDriver);
- else Sampler8in8AddPoly( curVoice, ASCBuffer, chanNo, intDriver);
- }
-
- void Play8Mono( MADDriverRec *intDriver)
- {
- long i;
- Byte *alpha = (Byte*) intDriver->IntDataPtr;
-
- i = intDriver->ASCBUFFER;
- while( i-- > 0) *alpha++ = 0x80;
-
- for( i = 0 ; i < intDriver->DriverSettings.numChn; i++) Sample8BufferAddPoly ( &intDriver->chan[i], intDriver->IntDataPtr, 1, intDriver);
- }
-
- void Play8Stereo( MADDriverRec *intDriver)
- {
- long i;
- Byte *alpha = (Byte*) intDriver->IntDataPtr;
-
- i = intDriver->ASCBUFFER*2;
- while( i-- > 0) *alpha++ = 0x80;
-
- for( i = 0 ; i < intDriver->DriverSettings.numChn; i++)
- {
- Sample8BufferAdd ( &intDriver->chan[i], intDriver->IntDataPtr, intDriver);
- i++;
- Sample8BufferAdd ( &intDriver->chan[i], intDriver->IntDataPtr + 1, intDriver);
- }
- }
-
- void Play8PolyPhonic( MADDriverRec *intDriver)
- {
- long i, x;
- Byte *alpha = (Byte*) intDriver->IntDataPtr;
-
- x = intDriver->ASCBUFFER * intDriver->DriverSettings.numChn;
- while( x-- > 0) *alpha++ = 0x80;
-
- for( i = 0 ; i < intDriver->DriverSettings.numChn; i++)
- {
- Sample8BufferAddPoly( &intDriver->chan[ i], intDriver->IntDataPtr + i, intDriver->DriverSettings.numChn, intDriver);
- }
- }
-